Through the numerous distribution mechanisms, software is increasingly distributed as original source code or in forms that can be easily converted to source code. For example, generally, Java bytecodes may be converted into source code. Often, such codes may be easily de-compiled, and as such, malicious parties may be able to steal any associated intellectual property with relative ease. Furthermore, software tampering with malicious intent, for example, planting a Trojan horse in the end user's system, is a very undesirable possibility.
Thus, it would be desirable to have efficient and effective mechanisms for protecting software and associated intellectual property. In some applications, dedicated hardware with integrated decryption and execution units are available. In such an application, the cryptographic solution may provide secure protection of software. However, if a piece of software runs on standard hardware without any changes to virtual machines or available interpreters, other software protection mechanisms are desirable.
Software systems are increasingly written in object-oriented programming languages, such as C++ and Java. Object-oriented languages provide a natural framework for programmers to express the overall design and the intent of individual operations carried out by programs. Oftentimes there is a desire for object-oriented programmers to provide understandable and modifiable programs so that another programmer can later alter the original program for his or her own purpose. As such, object-oriented programs and applications are especially susceptible to piracy and other forms of malicious conduct. Therefore, in object-oriented programs and applications, it is particularly desirable to develop a viable approach to protecting software.